﻿Imports System.Net
Imports System.IO

Public Class FTP
    Protected m_Host As String
    Protected m_User As String
    Protected m_Pass As String

    Public Property Servidor() As String
        Get
            Return m_Host
        End Get
        Set(ByVal value As String)
            m_Host = value
        End Set
    End Property

    Public Property Usuario() As String
        Get
            Return m_User
        End Get
        Set(ByVal value As String)
            m_User = value
        End Set
    End Property

    Public Property Clave() As String
        Get
            Return m_Pass
        End Get
        Set(ByVal value As String)
            m_Pass = value
        End Set
    End Property

    Public Sub New(ByVal servidor As String, ByVal usuario As String, ByVal clave As String)
        Me.m_Host = servidor
        Me.m_User = usuario
        Me.m_Pass = clave
    End Sub

    Public Function EliminarArchivo(ByVal fichero As String) As String
        Dim PeticionFTP As FtpWebRequest

        ' Creamos una petición FTP con la dirección del fichero a eliminar
        PeticionFTP = CType(WebRequest.Create(New Uri(fichero)), FtpWebRequest)

        ' Fijamos el usuario y la contraseña de la petición
        PeticionFTP.Credentials = New NetworkCredential(m_User, m_Pass)

        ' Seleccionamos el comando que vamos a utilizar: Eliminar un fichero
        PeticionFTP.Method = WebRequestMethods.Ftp.DeleteFile
        PeticionFTP.UsePassive = False

        Try
            Dim respuestaFTP As FtpWebResponse
            respuestaFTP = CType(PeticionFTP.GetResponse(), FtpWebResponse)
            respuestaFTP.Close()

            Return String.Empty
        Catch ex As Exception
            ' Si se produce algún fallo, se devolverá el mensaje del error
            Return ex.Message
        End Try
    End Function

    Public Function ExisteObjeto(ByVal dir As String) As Boolean
        Dim PeticionFTP As FtpWebRequest

        ' Creamos una peticion FTP con la dirección del objeto que queremos saber si existe
        PeticionFTP = CType(WebRequest.Create(New Uri(dir)), FtpWebRequest)

        ' Fijamos el usuario y la contraseña de la petición
        PeticionFTP.Credentials = New NetworkCredential(m_User, m_Pass)

        ' Para saber si el objeto existe, solicitamos la fecha de creación del mismo
        PeticionFTP.Method = WebRequestMethods.Ftp.GetDateTimestamp

        PeticionFTP.UsePassive = False

        Try
            ' Si el objeto existe, se devolverá True
            Dim RespuestaFTP As FtpWebResponse
            RespuestaFTP = CType(PeticionFTP.GetResponse(), FtpWebResponse)

            Return True
        Catch ex As Exception
            ' Si el objeto no existe, se producirá un error y al entrar por el Catch
            ' se devolverá falso
            Return False
        End Try
    End Function

    Public Function CreaDirectorio(ByVal dir As String) As String
        Dim PeticionFTP As FtpWebRequest

        ' Creamos una peticion FTP con la dirección del directorio que queremos crear
        PeticionFTP = CType(WebRequest.Create(New Uri(dir)), FtpWebRequest)

        ' Fijamos el usuario y la contraseña de la petición
        PeticionFTP.Credentials = New NetworkCredential(m_User, m_Pass)

        ' Seleccionamos el comando que vamos a utilizar: Crear un directorio
        PeticionFTP.Method = WebRequestMethods.Ftp.MakeDirectory

        Try
            Dim respuesta As FtpWebResponse
            respuesta = CType(PeticionFTP.GetResponse(), FtpWebResponse)
            respuesta.Close()

            Return String.Empty
        Catch ex As Exception
            ' Si se produce algún fallo, se devolverá el mensaje del error
            Return ex.Message
        End Try
    End Function

    Public Function SubirFichero(ByVal archivo As String, ByVal destino As String, ByVal dir As String) As String

  

        Dim infoFichero As New FileInfo(archivo)

        Dim uri As String
        ' uri = dir & "/" & destino

        ' Si no existe el directorio, lo creamos
        'If Not ExisteObjeto(dir) Then
        '    CreaDirectorio(dir)
        'End If




        Dim PeticionFTP As FtpWebRequest

        ' Creamos una peticion FTP con la dirección del fichero que vamos a subir
        PeticionFTP = CType(FtpWebRequest.Create(New Uri("ftp://192.168.5.85")), FtpWebRequest)

        ' Fijamos el usuario y la contraseña de la petición
        PeticionFTP.Credentials = New NetworkCredential(m_User, m_Pass)

        PeticionFTP.KeepAlive = False
        PeticionFTP.UsePassive = False

        ' Seleccionamos el comando que vamos a utilizar: Subir un fichero
        PeticionFTP.Method = WebRequestMethods.Ftp.UploadFile

        ' Especificamos el tipo de transferencia de datos
        PeticionFTP.UseBinary = True

        ' Informamos al servidor sobre el tamaño del fichero que vamos a subir
        PeticionFTP.ContentLength = infoFichero.Length

        ' Fijamos un buffer de 2KB
        Dim longitudBuffer As Integer
        longitudBuffer = 2048
        Dim lector As Byte() = New Byte(2048) {}

        Dim num As Integer

        ' Abrimos el fichero para subirlo
        Dim fs As FileStream
        fs = infoFichero.OpenRead()

        Try
            Dim escritor As Stream
            escritor = PeticionFTP.GetRequestStream()

            ' Leemos 2 KB del fichero en cada iteración
            num = fs.Read(lector, 0, longitudBuffer)

            While (num <> 0)
                ' Escribimos el contenido del flujo de lectura en el 
                ' flujo de escritura del comando FTP
                escritor.Write(lector, 0, num)
                num = fs.Read(lector, 0, longitudBuffer)
            End While

            escritor.Close()
            fs.Close()

            Return String.Empty
        Catch ex As Exception
            ' Si se produce algún fallo, se devolverá el mensaje del error
            Return ex.Message
        End Try
    End Function
End Class
